package Reflect;

import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

public class ReflectDemo6 {
    public static void main(String[] args) throws Exception{
        Class<?> aClass = Class.forName("Reflect.Person");
        Method method = aClass.getMethod("test", Integer.class);
        String name = method.getName();
        System.out.println("方法名字："+name);

        Class<?> returnType = method.getReturnType();
        System.out.println("输入返回值类型：" + returnType);

        Class<?>[] parameterTypes = method.getParameterTypes();
        for (Class paramter : parameterTypes){
            System.out.println("参数类型：" + paramter);
        }

//        int parameterCount = method.getParameterCount();
//        System.out.println("方法参数个数："+parameterCount);

        System.out.println("方法参数个数："+parameterTypes.length);

        //得到方法的访问修饰符
        int modifiers = method.getModifiers();
//        System.out.println(modifiers);
        switch (modifiers){
            case Modifier.PRIVATE:
                System.out.println("是一个private方法");
                break;
            case Modifier.PUBLIC:
                System.out.println("是一个public方法");
                break;
            default:
                System.out.println("暂时先不了解");
        }

//        Person person = new Person();
//        person.hehe()
        //私有方法只能在本类中使用
        Class<?> name1 = Class.forName("Reflect.Person");
        Object object = name1.newInstance();
//        Method method1 = name1.getMethod("hehe", null);
//        method1.invoke(method1);
        /*
        Class对象的getMethod和getMethods方法
        只能获取该类中的公开方法，包括从父类继承的公开方法

        getDeclaredMethod和getDeclaredMethods可以获取本类中的
        任何所有方法，但是仅仅在本类中，不包含父类继承的方法
        getDeclaredxxxx方法都是获取本类自己定义的内容
         */
        Method method2 = name1.getDeclaredMethod("hehe");
        method2.setAccessible(true);
        method2.invoke(object);
        method2.setAccessible(true);






    }
}
